Memcached原理与应用

标签: linux


笔者Q:972581034 交流群:605799367。有任何疑问可与笔者或加群交流

1.Memcached是什么

  • 高性能
  • 支持高并发
  • 分布式内存缓存系统
  • 协议简单且部署方便

服务端软件名字如: Memcached-1.4.24.tar.gz
客户端软件的名字形如: Memcache-2.25.tar.gz


2.作用和原理

  • 多数Web应用都将数据保存到关系型数据库中,如MySQL,Web服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,关系型数据库的负担就会出现加重、响应缓慢、导致网站打开延迟等问题。所以Memcached的主要目的是通过自身内存中缓存关系型数据库的查询结果,减少数据库自身被访问的次数,以提高动态Web应用的速度、提高网站架构的并发能力和可扩展性。

  • 通过在事先规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对数据库的直新年好高并发访问,从而达到提升大规模网站集群中动态服务的并发访问能力

  • web服务器读取数据时先读memcached服务器,若memcached没有,则向数据库请求数据,然后web再把请求到的数据发送到memcached

常见内存缓存服务软件对比

|软件|类型|主要作用|缓存的数据|
| ------- |-------😐 :--------: |
|Memcached|纯内存型|常用于缓存网站后端的各类数据,例如数据库中的数据|主要缓存用户重复请求的动态内容,例如:BLOG的博文、BBS的帖子等内容以及用户的Session会话信息。|
|Redis、Memcachedb(新浪开发)|可持久化存储,即使用内存,也会使用磁盘存储|1、缓存后端数据库的查询数据。 2、作为关系数据库的重要补充。|1、作为缓存:主要缓存用户重复请求的动态内容:例如:BLOG的博文、BBS的帖子等内容。2、作为数据库的有效补充:例如:好友关注、粉丝统计、业务统计等功能可以用持久化存储。|
|Squid、Nginx|内存或内存加磁盘缓存|主要用一缓存web前端的服务内容|主要用于静态数据缓存,例如:图片,附件(压缩包),js、css、html等,此部分功能大多数企业会选择专业的CDN公司如:网宿、蓝讯|

应用场景

1.完整数据缓存

例如:电商的商品分类功能不会经常变动,就可以事先放到Memcached里,然后对外提供数据访问,即"数据预热"。
这时只需要读取缓存而无需读取数据,数据库访问压力大大降低了。


为什么商品分类数据可事先放到缓存?
因为商品分类几乎都是由内部人员管理的,如需更新数据,更新数据库后,就可以把数据同时更新到Memcached里。 商品分类更新频率不是很大。 如果把商品分类数据做成静态化文件,然后,通过在前端WEB缓存或者使用CDN加速效果更好。

2.热点数据缓存

热点数据缓存一般是用于由用户更新的商品,如淘宝卖家,当卖家新增商品后,网站程序就会把商品写入后端数据库,同时把这部分数据放入Memcache内存中,下一次访仍这个商品的请求就直接从Memcached中取走。这种方法用来缓存网站热点数据,即利用Memcached缓存经常被访问的数据。

这个过程可以通过程序实现,也可在数据库上安装相关软件进行设置,直接由数据库把内容更新到Memcached中,相当于Memcached是MySQL从库.

几大电商双11秒杀场景:

在这种高并发情况下,必须先预热各种缓存,包括前端的Web缓存和后端数据库缓存。
先把数据放入内存预热,然后在逐步动态更新。先读取缓存,如果缓存里没有对应的数据,再云读取数据库,然后把读到的数据放入缓存。如果数据库里的数据更新,需要同时触发缓存更新,防止给用户过期的数据,当然,对于这种百万级别并发还有很多其它要做的。


作为集群节点的session会话共享存储

即把客户端用户请求多个前端应用服务集群产生的session会话信息,统一存储到一个Memcached缓存中。
由于session会话数据是存储在内存中的,所以很快。

3.特性

  • 协议简单

基于文本行的协议,可通过telnet/nc等命令直接操作memcached服务存取数据。

  • 支持epoll/kqueue异步I/O模型,使用libevent作为事件处理通知机制

简而言之,libevent是一套利用C开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,确保即使服务器端的连接数增加也能发挥很好的性能。memcached就是利用这个libevent库进行异步事件处理。

  • key/value键值数据类型

被缓存的数据以key/value键值形式存在的,例如:
oldboy—>36,key=oldboy,value=36
oldgirl—>28,key=oldgirl,value=28
通过oldboy key可以获取到36值,同理通过oldgirl key可以获取28值。

  • 全内存缓存,效率高

memcached管理内存的方式非常高效,即全部的数据都存放于memcached服务事先分配好的内存中,无持久化存储的设计,和系统的物理内存一样,当重启系统或memcached服务时,memcached内存中的数据机会丢失。

如希望重启后,数据依然能保留,可采用redis——持久性内存缓存系统

当内存中缓存的数据容量达到服务启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据。也可以存放数据时对存储的数据设置过期时间,这样过期后数据就自动被清除,memcached服务本身不会监控数据过期,而是在访问的时候查看key的时间戳判断是否过期。

  • 可支持分布式集群
    memcached没有像MySQL那样的主从复制方式,分布式memcached集群的不同服务器之间是互不通信的,每一个节点都是独立存取数据,并且数据内容也应该是不一样的。通过对Web应用端的程序设计或者通过支持hash算法的负载均衡换件,可以让memcached支持大规模海量分布式缓存集群应用。